package cn.skylark.wcm.controller;

import cn.skylark.wcm.common.util.ReturnMap;
import cn.skylark.wcm.entity.Filetable;
import cn.skylark.wcm.service.FileUploadService;
import cn.skylark.wcm.service.RecycleService;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import net.sf.json.JSONArray;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 回收站控制器类
 *
 * @author 武文旭
 * @Date 20180109
 * @since
 */
@Api(value = "回收站相关的接口")
@CrossOrigin
@RestController
@RequestMapping("/recycle")
public class RecycleController {
    /**
     * logger
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(RecycleController.class);

    @Autowired
    RecycleService recycleService;
    @Autowired
    FileUploadService fileUploadService;

    /**
     * 获取该用户已删除的文件列表
     * 已删除的文件列表delflg的状态值为1
     *
     * @param filetable 参数为用户id
     * @return map 为filetable对象
     */
    @RequestMapping("/getDeleteFile")
    public Map<String, Object> getDeleteFile(Filetable filetable, String draw, HttpServletRequest request,
                                             @RequestParam(required = false, defaultValue = "1") int start,
                                             @RequestParam(required = false, defaultValue = "10") int length) {
        LOGGER.info("获取所有回收站信息开始 文件=" + filetable + "开始页" + start + "条数" + length);
        String searchValue = request.getParameter("search[value]");
        String flag = request.getParameter("flag");
        Map<String, Object> map = new HashMap<>();
        PageInfo<Filetable> pageInfo = recycleService.selectByPage(filetable, searchValue, flag, start, length);
        map.put("draw", draw);
        map.put("recordsTotal", pageInfo.getTotal());
        map.put("recordsFiltered", pageInfo.getTotal());
        map.put("data", pageInfo.getList());
        LOGGER.info("获取所有回收站信息结束");
        return map;
    }


    /**
     * 查看恢复文件是否存在
     * 通过id返回的对象数据，去查看filetable表中是否有数据存在，并提示
     * 业务:恢复文件夹，首先通过这个方法判断回收站文件是否存在，
     * 如果存在则返回提示询问，如不存在直接恢复
     *
     * @param filetableId
     * @return
     * @Exception e 为数据库是否连接异常
     */
    @RequestMapping("/recoveryFile")
    public String recoveryFile(Filetable filetableId, String state) {
        LOGGER.info("查看恢复文件是否存在开始 文件=" + filetableId);
        ReturnMap ret = new ReturnMap();
        try {
            Filetable filetable = recycleService.getFiletable(filetableId);
            List<Filetable> filetableList = recycleService.getRepeatFile(filetable);
            /**
             * state ==1 为有重复文件要进行替换
             * state ==0 为没有重复文件进行恢复
             * state ==？ 传入参数异常，不如何程序设定
             */
            if ("1".equals(state)) {
                recycleService.replaceFile(filetable, filetableList);
                ret.setFlg(0);
                ret.setMessage("文件恢复成功");
            } else if ("0".equals(state)) {
                if (filetableList.size() == 0) {
                    recycleService.recoveryFile(filetable);
                    ret.setFlg(0);
                    ret.setMessage("文件恢复成功");
                } else {
                    ret.setFlg(1);
                    ret.setMessage("文件重复是否恢复");
                    ret.setData(JSONArray.fromObject(filetable.getId()).toString());
                }
            } else {
                ret.setFlg(2);
                ret.setMessage("传入参数有误");
            }
            return ret.ReturnMap();
        } catch (Exception e) {
            LOGGER.info("异常信息为=" + e);
            e.printStackTrace();
            ret.setFlg(2);
            ret.setMessage("恢复文件失败！");
            return ret.ReturnMap();
        }
    }


    /**
     * 彻底删除文件
     * 1、通过id将filetable表中的信息
     * 2、去对象存储将文件删除
     *
     * @param filetable 为filetable对象
     * @return 提示信息
     * @Exception e 为数据库连接失败
     */
    @RequestMapping("/deleteFileThorough")
    public String deleteFileThorough(Filetable filetable) {
        LOGGER.info("彻底删除单个文件开始 文件=" + filetable);
        ReturnMap ret = new ReturnMap();
        try {
            recycleService.deleteFileThorough(filetable);
            ret.setFlg(0);
            ret.setMessage("彻底删除单个文件成功");
            LOGGER.info("彻底删除单个文件结束");
            return ret.ReturnMap();
        } catch (Exception e) {
            LOGGER.info("异常信息为=" + e);
            e.printStackTrace();
            ret.setFlg(2);
            ret.setMessage("彻底删除单个文件失败！");
            return ret.ReturnMap();

        }
    }

    /**
     * 清空回收站
     */

    @RequestMapping("/emptyRecycle")
    public String emptyRecycle(Filetable filetable, String flag) {
        LOGGER.info("清空回收站文件开始 文件=" + filetable);
        ReturnMap ret=new ReturnMap();
        try {
            recycleService.emptyRecycle(filetable, flag);
            ret.setFlg(0);
            ret.setMessage("清空回收站文件成功");
            return ret.ReturnMap();
        } catch (Exception e) {
            LOGGER.info("异常信息为=" + e);
            e.printStackTrace();
            ret.setFlg(2);
            ret.setMessage("清空回收站文件失败！");
            return ret.ReturnMap();

        }
    }

}
